package com.bbva.gptf.front.web;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.bbva.gptf.dto.bean.Liquidez;
import com.bbva.gptf.dto.servicio.liquidez.ServicioLiquidez;
import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.servicios.informes.ServicioJasper;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;

@RequestMapping("/controladorliquidez/**")
@Controller
public class ControladorLiquidez {

	@Resource(name = "servicioLiquidezHttpHTTPClient")
	private ServicioLiquidez servicioLiquidez;
	private Map<String, Object> attributes;
	private final static BigDecimal TOTREGISTROS = new BigDecimal(20);

	@Autowired
	private ServicioJasper servicioJasper;

	private String fechaActualizacion;

	@RequestMapping(value = "/exportarExcel", method = RequestMethod.GET)
	public String exportarExcel(final HttpServletResponse response) {
		final List<Liquidez> datos = servicioLiquidez
				.obtieneLiquidezPorContrato();
		final String nombreInforme = "ReporteLiquidez";
		try {
			generaReporte(nombreInforme, datos, response);
		} catch (final PropiedadNoEncontradaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public void generaReporte(final String nombreInforme,
			final List<Liquidez> datos, final HttpServletResponse response)
			throws PropiedadNoEncontradaExcepcion {
		try {
			response.setHeader("Content-Disposition", "attachment; filename=\""
					+ nombreInforme + ".xls\"");
			// final ResourceLoader rl = new DefaultResourceLoader();
			// org.springframework.core.io.Resource resource = null;
			// resource = rl.getResource("classpath:informes/liquidez/");
			final ServletOutputStream servletOutputStream = response
					.getOutputStream();
			final String rutaInforme = ArqSpringContext
					.getPropiedad("com.bbva.jee.arq.spring.core.rutainformes")
					+ "/liquidez/" + nombreInforme;
			servicioJasper.compile(rutaInforme, rutaInforme);
			final JRDataSource dataSource = new JRBeanCollectionDataSource(
					datos);
			servicioJasper.generarReportColeccion(rutaInforme, rutaInforme,
					dataSource);
			servicioJasper.exportarXlsWeb(rutaInforme, servletOutputStream);
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @return the fechaActualizacion
	 */
	public String getFechaActualizacion() {
		try {
			return servicioLiquidez.obtieneFechaActualizacion();
		} catch (final Exception e) {

		}
		return fechaActualizacion;

	}

	@RequestMapping(value = "/liquidez", method = RequestMethod.GET)
	public String liquidez(final Model uiModel, final HttpServletRequest request) {
		attributes = new HashMap<String, Object>();
		final List<Liquidez> liqContrato = servicioLiquidez
				.obtieneLiquidezPorContrato();
		request.getSession().setAttribute("datos", liqContrato);
		paginar(BigDecimal.ONE, TOTREGISTROS, request.getSession());
		uiModel.addAllAttributes(attributes);
		return "liquidez/liqContrato";
	}

	@RequestMapping(value = "/paginar", method = RequestMethod.GET)
	public String paginacion(@RequestParam("page") final Object pg,
			@RequestParam("size") final Object sz, final Model uiModel,
			final HttpServletRequest request) {
		attributes = new HashMap<String, Object>();

		final BigDecimal page = pg != null
				&& StringUtils.isNumeric(pg.toString()) ? new BigDecimal(
				pg.toString()) : BigDecimal.ONE;
		final BigDecimal size = sz != null
				&& StringUtils.isNumeric(sz.toString()) ? new BigDecimal(
				sz.toString()) : TOTREGISTROS;
		paginar(page, size, request.getSession());
		uiModel.addAllAttributes(attributes);
		return "liquidez/liqContrato";
	}

	@SuppressWarnings("unchecked")
	public void paginar(final BigDecimal pagina, BigDecimal size,
			final HttpSession session) {
		final List<Liquidez> datos = (List<Liquidez>) session
				.getAttribute("datos");
		List<Liquidez> listaMostrar = new ArrayList<Liquidez>();
		final BigDecimal page = pagina.compareTo(BigDecimal.ONE) >= 0 ? pagina
				.subtract(BigDecimal.ONE) : BigDecimal.ZERO;
		size = size.compareTo(BigDecimal.ONE) >= 0 ? size : BigDecimal.ONE;
		BigDecimal recordCount = BigDecimal.ZERO;

		BigDecimal fromIndex = BigDecimal.ZERO;
		BigDecimal toIndex = BigDecimal.ZERO;
		if (datos != null && !datos.isEmpty()) {
			recordCount = new BigDecimal(datos.size());

			fromIndex = page.multiply(size).compareTo(BigDecimal.ZERO) != 0 ? page
					.multiply(size) : BigDecimal.ZERO;
			toIndex = fromIndex.add(size).compareTo(recordCount) <= 0 ? fromIndex
					.add(size) : recordCount;

			listaMostrar = datos.subList(fromIndex.intValue(),
					toIndex.intValue());
			fromIndex = fromIndex.add(BigDecimal.ONE);
		}
		attributes.put("datos", listaMostrar);
		attributes.put("recordCount", recordCount);
		attributes.put("fromIndex", fromIndex.toString());
		attributes.put("toIndex", toIndex.toString());
		attributes.put("size", size.intValue());
		attributes.put("page", pagina.intValue());
		attributes.put("fechaActualizacion", getFechaActualizacion());

	}

	@RequestMapping(method = RequestMethod.POST, value = "{id}")
	public void post(@PathVariable final Long id, final ModelMap modelMap,
			final HttpServletRequest request, final HttpServletResponse response) {
	}

	/**
	 * @param fechaActualizacion
	 *            the fechaActualizacion to set
	 */
	public void setFechaActualizacion(final String fechaActualizacion) {
		this.fechaActualizacion = fechaActualizacion;
	}

	/**
	 * @param servicioLiquidez
	 *            the servicioLiquidez to set
	 */
	public void setServicioLiquidez(final ServicioLiquidez servicioLiquidez) {
		this.servicioLiquidez = servicioLiquidez;
	}

}
